﻿/**
 * Botón:
 * - Operaciones básicas: encender, apagar, resaltar y desresaltar, con sus respectivos difusores de eventos.
 * - Realiza la detección de eventos del usuario: rollOver, rollOut, release, releaseOutside y press.
 *
 * Reserva los siguientes nombres: Boton_ref, encender, apagar, resaltar, desresaltar, Boton_inicializar.
 */
class Boton {
	private var encendido:Boolean;
	private var Boton_ref:Boton;

	public static var wrap:Function = aplicar;
	private var clip_boton:MovieClip;
	
	private var transicion_encender,
	transicion_apagar,
	transicion_resaltar,
	transicion_desresaltar:Transicion;
	
	/**
	 * @param transiciones: Object = {transicion_encender, transicion_apagar, transicion_resaltar, transicion_desresaltar}
	 */
	public static function aplicar(receptor:MovieClip, transiciones:Object):MovieClip {
		// For some compilers that force to asign new objects to a variable.
		var boton:Boton = new Boton(receptor, transiciones);
		return receptor;
	}
	
	public function Boton(receptor:MovieClip, transiciones:Object) {
		//trace("Boton: " + receptor);
		ButtonEvent.aplicar(receptor);
		ControladorBotonBasico.aplicar(receptor);
		/* TODO Los atributos que no vengan definidos reemplazarlos por una transición predeterminada. */
		transicion_encender = transiciones.transicion_encender;
		transicion_apagar = transiciones.transicion_apagar;
		transicion_resaltar = transiciones.transicion_resaltar;
		transicion_desresaltar = transiciones.transicion_desresaltar;
		
		receptor.Boton_ref = this;
		receptor.Boton_ref.clip_boton = receptor;
		receptor.Boton_inicializar = Boton_inicializar;
		receptor.resaltar = resaltar;
		receptor.desresaltar = desresaltar;
		receptor.encender = encender;
		receptor.apagar = apagar;
		receptor.Boton_inicializar();
	}

	private function Boton_inicializar():Void {
		Boton_ref.encendido = false;
		Boton_ref.transicion_encender.addEventListener("fin_transicion", Boton_ref);
		Boton_ref.transicion_apagar.addEventListener("fin_transicion", Boton_ref);
		Boton_ref.transicion_resaltar.addEventListener("fin_transicion", Boton_ref);
		Boton_ref.transicion_desresaltar.addEventListener("fin_transicion", Boton_ref);
		//Boton_ref.clip_boton = this;
	}
	
	public function fin_transicion(evt:Object):Void {
		var type:String;
		switch(evt.target) {
			case transicion_encender:
			type = "fin_encender";
			break;
			case transicion_apagar:
			type = "fin_apagar";
			break;
			case transicion_resaltar:
			type = "fin_resaltar";
			break;
			case transicion_desresaltar:
			type = "fin_desresaltar";
			break;
		}
		clip_boton.dispatchEvent({type: type, target: clip_boton, extra_param_transicion: evt});
	}
	
	public function resaltar():Void {
		//trace("Boton.resaltar: ");
		if(!Boton_ref.encendido) {
			Boton_ref.transicion_encender.cancelar();
			Boton_ref.transicion_apagar.cancelar();
			Boton_ref.transicion_desresaltar.cancelar();
			
			Boton_ref.transicion_resaltar.hacer_gradual();
		}
	}

	public function desresaltar():Void {
		if(!Boton_ref.encendido) {
			Boton_ref.transicion_encender.cancelar();
			Boton_ref.transicion_apagar.cancelar();
			Boton_ref.transicion_resaltar.cancelar();
		
			Boton_ref.transicion_desresaltar.hacer_gradual();
		}
	}
	
	public function encender():Void {
		if(!Boton_ref.encendido) {
			Boton_ref.encendido = true;
			
			Boton_ref.transicion_apagar.cancelar();
			Boton_ref.transicion_resaltar.cancelar();
			Boton_ref.transicion_desresaltar.cancelar();

			Boton_ref.transicion_encender.hacer_gradual();
		}
	}
	
	public function apagar():Void {
		Boton_ref.encendido = false;
		
		Boton_ref.transicion_encender.cancelar();
		Boton_ref.transicion_resaltar.cancelar();
		Boton_ref.transicion_desresaltar.cancelar();
		
		Boton_ref.transicion_apagar.hacer_gradual();
	}
}